package com.reflection;

import java.lang.reflect.Method;

/**
 * 用反射机制调用对象的方法
 *
 *
 * 在例程 InvokeTester 类的 main() 方法中，运用反射机制调用一个 InvokeTester 对象的 add() 和 echo() 方法
 add() 方法的两个参数为 int 类型，获得表示 add() 方法的 Method 对象的代码如下：
 Method addMethod=classType.getMethod("add",new Class[]{int.class,int.class});
 Method 类的 invoke(Object obj,Object args[]) 方法接收的参数必须为对象，如果参数为基本类型数据，必须转换为相应的包装类型的对象。 invoke() 方法的返回值总是对象，如果实际被调用的方法的返回类型是基本类型数据，那么 invoke() 方法会把它转换为相应的包装类型的对象，再将其返回。
 在本例中，尽管 InvokeTester 类的 add() 方法的两个参数以及返回值都是 int 类型，调用 add Method 对象的 invoke() 方法时，只能传递 Integer 类型的参数，并且 invoke() 方法的返回类型也是 Integer 类型， Integer 类是 int 基本类型的包装类：
 Object result=addMethod.invoke(invokeTester,
 new Object[]{new Integer(100),new Integer(200)});
 System.out.println((Integer)result); //result 为 Integer 类型
 * @author jiangbang
 * @date 2016/8/31
 */
public class InvokeTester {
    public int add(int param1, int param2) {
        return param1 + param2;
    }

    public String echo(String msg) {
        return "echo: " + msg;
    }

    public static void main(String[] args) throws Exception {
        Class<?> classType = InvokeTester.class;
        Object invokeTester = classType.newInstance();

        // Object invokeTester = classType.getConstructor(new
        // Class[]{}).newInstance(new Object[]{});


        // 获取 InvokeTester 类的 add() 方法
        Method addMethod = classType.getMethod("add", new Class[]{int.class, int.class});
        // 调用 invokeTester 对象上的 add() 方法
        Object result = addMethod.invoke(invokeTester, new Object[]{new Integer(100), new Integer(200)});
        System.out.println((Integer) result);


        // 获取 InvokeTester 类的 echo() 方法
        Method echoMethod = classType.getMethod("echo", new Class[]{String.class});
        // 调用 invokeTester 对象的 echo() 方法
        result = echoMethod.invoke(invokeTester, new Object[]{"Hello"});
        System.out.println((String) result);
    }
}
